forked from yui/yui3-gallery
-
Notifications
You must be signed in to change notification settings - Fork 10
/
animloop.js
107 lines (94 loc) · 3.35 KB
/
animloop.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/*
* Copyright (c) 2011 Nicholas C. Zakas. All rights reserved.
* http://www.nczonline.net/
*/
/**
* Animation loop for optimizing game animation control. Based on
* technique described at http://nokarma.org/2010/02/02/javascript-game-development-the-game-loop/.
* @module gallery-animloop
*/
/*global YUI*/
//-----------------------------------------------------------------------------
// Local Variables
//-----------------------------------------------------------------------------
var run = false, //determines if the loop should be executed
runLoop, //method that starts the loop
event = {type:"beforedraw"}, //event that fires before it's time to draw
AnimLoop; //main object
//-----------------------------------------------------------------------------
// Main Object
//-----------------------------------------------------------------------------
/**
* Represents an animation loop, set for optimal frames-per-second rates
* using either setInterval() or available requestAnimationFrame methods.
* In order to use, assign an event handler to the "beforedraw" event,
* this is where you should do any calculations for animation.
* @class AnimLoop
* @static
*/
AnimLoop = {
/**
* Starts the animation loop.
* @method start
* @return {void}
*/
start: function(){
if (!run){
Y.log("Request to start animation loop.", "info", "AnimLoop");
run = true;
runLoop();
}
},
/**
* Stops the animation loop by setting the run variable to false.
* The next time a draw happens, this flag is checked and the
* animation loop will be aborted.
* @method stop
* @return {void}
*/
stop: function(){
Y.log("Request to stop animation loop.", "info", "AnimLoop");
run = false;
}
};
//inherit custom events
Y.augment(AnimLoop, Y.Event.Target);
//determine the best function to use for drawing
runLoop = (function(){
var innerFunction,
intervalId;
if (window.mozRequestAnimationFrame){
innerFunction = function() {
if (run){
Y.log("Running using mozRequestAnimationFrame.", "info", "AnimLoop");
AnimLoop.fire(event);
window.mozRequestAnimationFrame(innerFunction);
}
Y.log("Stopping animation loop.", "info", "AnimLoop");
};
} else if (window.webkitRequestAnimationFrame){
innerFunction = function() {
if (run){
Y.log("Running using webkitRequestAnimationFrame.", "info", "AnimLoop");
AnimLoop.fire(event);
window.webkitRequestAnimationFrame(innerFunction);
}
};
Y.log("Stopping animation loop.", "info", "AnimLoop");
} else {
innerFunction = function(){
intervalId = setInterval(function(){
if (run){
Y.log("Running using setInterval.", "info", "AnimLoop");
AnimLoop.fire(event);
} else {
Y.log("Stopping animation loop.", "info", "AnimLoop");
clearInterval(intervalId);
}
}, 1000 / 60);
}
}
return innerFunction;
})();
//export
Y.AnimLoop = AnimLoop;